package com;

/**
 * Atom est un atome
 * C'est un exemple de prédicat utilisant des constantes à la place de ses variables
 * @author florent
 */
public class Atom{

	private Modele modele = null; //modèle de l'atome / son prédicat
	private Constante[] constantes = null; //constantes de cet atome
	private int nb_elements=0; //nombre de constantes deja ajoutés dans constantes

	/**
	 * Construit un atome a partir de son nom de prédicat et de sa verité
	 * @param predicat nom du predicat de cet atome
	 * @param negative verité de l'atome
	 */
	public Atom(String predicat,boolean negative){
		modele = Modele.newModele(predicat,negative); //récupère son modèle
		constantes = new Constante[modele.getArite()]; //construit les constantes
	}

	/**
	 * Retourne le modèle de l'atome
	 * @return le modèle de l'atome
	 */
	public Modele getModele(){
		return modele;
	}

	/**
	 * Retourne vrai si le modèle de l'atome est négatif
	 * @return vrai si le modèle de l'atome est négatif
	 */
	public boolean isNegative(){
		return modele.isNegative();
	}

	/**
	 * Retourne la liste des constantes
	 * @return la liste des constantes
	 */
	public Constante[] getConstantes(){
		return constantes;
	}

	/**
	 * Ajoute une constante dans l'atome
	 * @param constante
	 */
	public void addConstante(String constante){
		if(nb_elements < constantes.length){
			constantes[nb_elements]= Constante.newConstante(constante,modele.getArguments()[nb_elements]);
			nb_elements++;
		}
	}

	public String toString(){
		StringBuffer sb = new StringBuffer();

		if(modele.isNegative())
			sb.append("!");

		sb.append(modele.getPredicat());
		sb.append("(");
		for(int i = 0;i<constantes.length; ++i){
			sb.append(constantes[i].toString());
			if(i!=constantes.length-1)
				sb.append(",");
		}
		sb.append(")");

		return sb.toString();
	}

}
